/*
 * 文 件 名:  CommonTool.java
 * 版    权:  Huawei Technologies Co., Ltd. Copyright 2008-9999,  All rights reserved
 * 描    述:  <描述>
 * 创 建 人:  chengang
 * 创建时间:  2009-4-23
 * 修 改 人:  chengang
 * 修改时间:  2009-4-23
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.chinastar.iweb.common.util;

import java.io.File;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Stack;

/**
 * 公共工具方法类
 * <功能详细描述>
 * 
 * @author  chengang
 * @version  [版本号, 2009-4-23]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public final class CommonTool
{
    private static final int BUFFER_CASE = 1024;
    
    private static final int SIZE = 1024;
    
    private static final int STR_BUILDER = 52;
    
    private static final int NUM_LENGTH = 8;
    
    private static final int PASSWORD_BYTE = 32;
    
    private static final int HEXSTRING_LENGTH = 2;
    
    private static final int HEXSTRING_BYTE = 0xFF;
    
    private CommonTool()
    {
        
    }
    
    /** 判断对象是否为空
     * 该函数用来判断对象是否为空
     * @param obj 需要校验的对象实例
     * @return boolean 返回校验是否为空
     * 
     * @see [类、类#方法、类#成员]
     */
    public static boolean isEmpty(Object obj)
    {
        boolean bool = false;
        bool = isNull(bool,obj);
        bool = isCollection(bool,obj);
        bool = isMap(bool,obj);
        bool = isString(bool,obj);
        return bool;
    }
    
    /**
     * 是否为空
     * <功能详细描述>
     * @param bool bool
     * @param obj obj
     * @return boolean boolean
     * @see [类、类#方法、类#成员]
     */
    public static boolean isNull(boolean bool,Object obj)
    {
        if (null == obj)
        {
            bool = true;
        }
        return bool;
    }
    /**
     * 是否为Collection类型
     * <功能详细描述>
     * @param bool bool
     * @param obj obj
     * @return boolean boolean
     * @see [类、类#方法、类#成员]
     */
    @SuppressWarnings("unchecked")
    public static boolean isCollection(boolean bool,Object obj)
    {
        if (obj instanceof Collection)
        {
            bool = ((List)obj).isEmpty();
        }
        return bool;
    }
    /**
     * 是否为Map类型
     * <功能详细描述>
     * @param bool bool
     * @param obj obj
     * @return boolean boolean
     * @see [类、类#方法、类#成员]
     */
    public static boolean isMap(boolean bool,Object obj)
    {
        if (obj instanceof String)
        {
            bool = ((String)obj).trim().length() == 0;
        }
        return bool;
    }
    /**
     * 是否为String类型
     * <功能详细描述>
     * @param bool bool
     * @param obj obj
     * @return boolean boolean
     * @see [类、类#方法、类#成员]
     */
    public static boolean isString(boolean bool,Object obj)
    {
        if (null == obj)
        {
            bool = true;
        }
        return bool;
    }
    
    /** <一句话功能简述>计算目录下所有文件大小(单位:兆 M)
     * @param file 目录文件
     * @return long 文件目录大小 
     * @see [类、类#方法、类#成员]
     */
    public static long fileSizeForMillion(File file)
    {
        long bitSize = fileSize(file);
        double fileMillionSize = (double)(bitSize + SIZE) / (double)BUFFER_CASE
                / (double)BUFFER_CASE;
        return (long)fileMillionSize;
    }
    
    /** <一句话功能简述>计算目录下所有文件大小(单位:字节 byte)
     * @param file 目录文件
     * @return long 文件目录大小
     * @see [类、类#方法、类#成员]
     */
    public static long fileSize(File file)
    {
        if (!file.exists())
        {
            return 0;
        }
        if (file.isFile())
        {
            return file.length();
        }
        long size = 0;
        Stack<File> commonFileList = new Stack<File>();
        commonFileList.push(file);
        while (!commonFileList.isEmpty())
        {
            File commonNodeDir = commonFileList.pop();
            File[] commonFiles = commonNodeDir.listFiles();
            
            size += sizes(commonFiles,size,commonFileList);
            commonFileList = list(commonFiles,size,commonFileList);
        }
        return size;
    }
    
    /**
     * 循环计算文件的大小
     * <功能详细描述>
     * @param files files
     * @param size size
     * @param fileList fileList
     * @return long long
     * @see [类、类#方法、类#成员]
     */
    
    public static long sizes(File[] files,long size,Stack<File> fileList)
    {
        for (int i = 0; i < files.length; i++)
        {
            if (files[i].isFile())
            {
                size += files[i].length();
            }
        }
        return size;
    }
    
    /**
     * 循环计算列表的大小
     * <功能详细描述>
     * @param files files
     * @param size size
     * @param fileList fileList
     * @return long long
     * @see [类、类#方法、类#成员]
     */
    
    public static Stack<File> list(File[] files,long size,Stack<File> fileList)
    {
        for (int i = 0; i < files.length; i++)
        {
            if (!files[i].isFile())
            {
                fileList.push(files[i]);
            }
        }
        return fileList;
    }
    
    /** <一句话功能简述>生成唯一的文件名
     * <功能详细描述>
     * 如 传入后缀为txt 返回xxxxx.txt
     * 如 传入后缀为.txt 返回xxxxx.txt
     * @param suffex 后缀名
     * @return [参数说明]
     * @see [类、类#方法、类#成员]
     */
    public static String uniquelyFileName(String suffex)
    {
        char[] constant = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                           'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                           'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                           'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                           'U', 'V', 'W', 'X', 'Y', 'Z'};
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String folderName = format.format(new Date());
        
        StringBuilder newRandom = new StringBuilder(STR_BUILDER);
        Random rd = new Random();
        for (int i = 0; i < NUM_LENGTH; i++)
        {
            newRandom.append(constant[rd.nextInt(STR_BUILDER)]);
        }
        if (suffex.startsWith("."))
        {
            return folderName + newRandom.toString() + suffex;
        }
        return folderName + newRandom.toString() + "." + suffex;
    }
    
    /** <一句话功能简述>解决'\'在IE中不能显示的问题
     * <功能详细描述>将所有的'\'转义为'/'
     * @param str 参数
     * @return [参数说明]
     * @see [类、类#方法、类#成员]
     */
    public static String parseBrowerChar(String str)
    {
        if (CommonTool.isEmpty(str))
        {
            return str;
        }
        return str.replace('\\', '/');
    }
    
    /**
     * 
     * [简要描述]:<br/>
     * [详细描述]:<br/>
     * 
     * @param str 原密码
     * @return String 加密密码
     * @throws NoSuchAlgorithmException 密码加密异常
     * @exception
     */
    public static String sha256Encrypt(String str) throws NoSuchAlgorithmException
    {
        MessageDigest messageDigest = null;
        messageDigest = MessageDigest.getInstance("SHA-256");
        byte[] byteArray = messageDigest.digest(str.getBytes());
        StringBuilder output = new StringBuilder(PASSWORD_BYTE);
        for (int i = 0; i < byteArray.length; ++i)
        {
            String temp = Integer.toHexString(byteArray[i] & HEXSTRING_BYTE);
            if (temp.length() < HEXSTRING_LENGTH)
            {
                output.append("0");
            }
            output.append(temp);
        }
        return output.toString();
    }
}
